"""
商务数据分析作业 - 简洁高效版
精简代码实现所有功能要求
"""

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from datetime import datetime

# 配置中文显示
plt.rcParams['font.sans-serif'] = ['DengXian Bold', 'Microsoft YaHei UI Bold', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False

def print_header(title):
    """打印标题"""
    print(f"\n{'='*60}")
    print(f"🚀 {title}")
    print(f"{'='*60}")

def process_salary_column(series):
    """处理工资列数据"""
    return pd.to_numeric(series.astype(str).str.replace(',', ''), errors='coerce')

def task_one():
    """任务一：员工数据分析"""
    print_header("任务一：pandas数据分析——公司人事财务数据分析")
    
    # 1. 加载数据
    print("📁 正在加载员工数据...")
    data = pd.read_excel('data.xlsx', header=1)  # 第二行作为列名
    print(f"✅ 数据加载完成，共{len(data)}行")
    
    # 显示数据行数
    print(f"\n📊 数据行数：{len(data)}")
    
    # 显示前10行和后15行
    print("\n📋 前10行数据：")
    print(data.head(10).to_string(max_cols=8))
    
    print("\n📋 后15行数据：")
    print(data.tail(15).to_string(max_cols=8))
    
    # 2. 处理缺失值和重复值
    print(f"\n🧹 数据清理前：缺失值{data.isnull().sum().sum()}个，重复值{data.duplicated().sum()}个")
    data = data.fillna("无").drop_duplicates()
    print(f"✅ 数据清理后：{len(data)}行数据")
    
    # 3. 统计在职员工和工资信息
    active_employees = len(data[data['在职状态'] == '在职'])
    print(f"\n👥 在职员工人数：{active_employees}人")
    
    # 工资统计
    if '应发工资' in data.columns:
        salary_data = data[data['应发工资'].notna() & (data['应发工资'] != "无")]
        if not salary_data.empty:
            salaries = process_salary_column(salary_data['应发工资']).dropna()
            if not salaries.empty:
                print(f"💰 应发工资最大值：{salaries.max():.2f}元")
                print(f"💰 应发工资最小值：{salaries.min():.2f}元")
    
    # 4. 添加新员工GH993
    new_employee = pd.DataFrame([{
        '序号': 993, '工号': 'GH993', '姓名': '陈七', '性别': '男',
        '手机号': '13555555555', '年龄': 30, '在职状态': '在职',
        '学历': '硕士', '应发工资': 9000, '籍贯': '浙江省'
    }])
    data = pd.concat([data, new_employee], ignore_index=True)
    print(f"\n➕ 已添加新员工：陈七(GH993)")
    
    # 5. 修改990号员工手机号
    if 990 in data['序号'].values:
        data.loc[data['序号'] == 990, '手机号'] = '15012345678'
        print("📱 已更新序号990员工的手机号")
    
    # 6. 删除符合条件的员工
    condition = (data['年龄'] > 55) & (data['在职状态'] == '离职') & (data['性别'] == '男')
    removed_count = condition.sum()
    data = data[~condition]
    print(f"🗑️ 已删除{removed_count}名符合条件的员工")
    
    # 7. 分组分析
    print("\n📊 分组分析结果：")
    
    # 按学历分组
    if '学历' in data.columns and '应发工资' in data.columns:
        valid_data = data[data['应发工资'].notna() & (data['应发工资'] != "无")].copy()
        if not valid_data.empty:
            valid_data['工资数值'] = process_salary_column(valid_data['应发工资'])
            edu_analysis = valid_data.groupby('学历')['工资数值'].mean().round(2)
            print("🎓 不同学历员工平均应发工资：")
            for edu, salary in edu_analysis.items():
                print(f"   {edu}: {salary}元")
    
    # 按性别分组
    if '性别' in data.columns:
        gender_analysis = valid_data.groupby('性别')['工资数值'].mean().round(2)
        print("\n👨👩 不同性别员工平均应发工资：")
        for gender, salary in gender_analysis.items():
            print(f"   {gender}: {salary}元")
    
    # 8. 导出数据
    data.to_excel('dataoutput.xlsx', index=False)
    print("\n💾 数据已导出到dataoutput.xlsx")
    
    return data

def create_quick_plots(population_data):
    """快速创建所有图表"""
    # 设置图表样式
    plt.style.use('default')
    
    # 创建2x2子图
    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(16, 12))
    fig.suptitle('人口数据可视化分析报告', fontsize=16, fontweight='bold')
    
    # 1. 城乡人口对比柱状图
    years = population_data['年份'].str.replace('年', '')
    x = np.arange(len(years))
    width = 0.35
    
    ax1.bar(x - width/2, population_data['城镇人口'], width, label='城镇人口', alpha=0.8)
    ax1.bar(x + width/2, population_data['乡村人口'], width, label='乡村人口', alpha=0.8)
    ax1.set_xlabel('年份')
    ax1.set_ylabel('人口数量（万人）')
    ax1.set_title('2014-2022年城乡人口变化')
    ax1.set_xticks(x)
    ax1.set_xticklabels(years, rotation=45)
    ax1.legend()
    ax1.grid(True, alpha=0.3)
    
    # 2. 2022年性别比例饼图
    data_2022 = population_data[population_data['年份'] == '2022年']
    if not data_2022.empty:
        male_pop = data_2022['男性人口'].iloc[0]
        female_pop = data_2022['女性人口'].iloc[0]
        
        ax2.pie([male_pop, female_pop], labels=['男性', '女性'], 
               autopct='%1.1f%%', startangle=90, colors=['lightblue', 'pink'])
        ax2.set_title('2022年男女人口比例')
    
    # 3. 城乡人口变化趋势折线图
    years_num = [int(year.replace('年', '')) for year in population_data['年份']]
    ax3.plot(years_num, population_data['城镇人口'], marker='o', label='城镇人口', linewidth=2)
    ax3.plot(years_num, population_data['乡村人口'], marker='s', label='乡村人口', linewidth=2)
    ax3.set_xlabel('年份')
    ax3.set_ylabel('人口数量（万人）')
    ax3.set_title('城乡人口变化趋势')
    ax3.legend()
    ax3.grid(True, alpha=0.3)
    
    # 4. 城镇人口与总人口关系散点图
    ax4.scatter(population_data['年末总人口'], population_data['城镇人口'], 
               c='red', alpha=0.7, s=100)
    ax4.set_xlabel('年末总人口（万人）')
    ax4.set_ylabel('城镇人口（万人）')
    ax4.set_title('城镇人口与年末总人口关系')
    ax4.grid(True, alpha=0.3)
    
    # 添加趋势线
    z = np.polyfit(population_data['年末总人口'], population_data['城镇人口'], 1)
    p = np.poly1d(z)
    ax4.plot(population_data['年末总人口'], p(population_data['年末总人口']), 
             "b--", alpha=0.8, linewidth=2)
    
    plt.tight_layout()
    plt.savefig('人口数据可视化报告_v5.png', dpi=300, bbox_inches='tight')
    plt.show()

def task_two():
    """任务二：人口数据可视化"""
    print_header("任务二：Python可视化分析——人口数据可视化展示")
    
    # 加载人口数据
    print("📁 正在加载人口数据...")
    population = pd.read_excel('population.xlsx')
    print(f"✅ 人口数据加载完成，包含{len(population)}年的数据")
    
    # 数据概览
    print("\n📊 人口数据概览：")
    print(population.to_string(index=False))
    
    # 快速统计分析
    print(f"\n📈 快速分析：")
    print(f"年份范围：{population['年份'].iloc[0]} - {population['年份'].iloc[-1]}")
    print(f"总人口变化：{population['年末总人口'].iloc[0]}万 → {population['年末总人口'].iloc[-1]}万")
    
    # 计算城镇化率
    population['城镇化率'] = (population['城镇人口'] / population['年末总人口'] * 100).round(2)
    print(f"城镇化率：{population['城镇化率'].iloc[0]}% → {population['城镇化率'].iloc[-1]}%")
    
    # 创建所有图表
    print("\n🎨 正在生成可视化图表...")
    create_quick_plots(population)
    
    # 保存各个单独图表
    create_individual_charts(population)
    
    return population

def create_individual_charts(data):
    """创建单独的图表文件"""
    plt.rcParams['figure.figsize'] = (10, 6)
    
    # 1. 城乡人口柱状图
    plt.figure()
    years = data['年份'].str.replace('年', '')
    x = np.arange(len(years))
    width = 0.35
    
    plt.bar(x - width/2, data['城镇人口'], width, label='城镇人口', color='steelblue', alpha=0.8)
    plt.bar(x + width/2, data['乡村人口'], width, label='乡村人口', color='darkorange', alpha=0.8)
    plt.xlabel('年份')
    plt.ylabel('人口数量（万人）')
    plt.title('2014-2022年城乡人口数据变化柱状图')
    plt.xticks(x, years, rotation=45)
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('城乡人口柱状图_v5.png', dpi=300, bbox_inches='tight')
    plt.close()
    
    # 2. 性别比例饼图
    data_2022 = data[data['年份'] == '2022年']
    if not data_2022.empty:
        plt.figure(figsize=(8, 8))
        sizes = [data_2022['男性人口'].iloc[0], data_2022['女性人口'].iloc[0]]
        labels = ['男性', '女性']
        colors = ['lightblue', 'lightpink']
        
        plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', 
                startangle=90, explode=(0.05, 0.05))
        plt.title('2022年男女人口比例情况饼图')
        plt.axis('equal')
        plt.savefig('2022年性别比例饼图_v5.png', dpi=300, bbox_inches='tight')
        plt.close()
    
    # 3. 趋势折线图
    plt.figure()
    years_num = [int(year.replace('年', '')) for year in data['年份']]
    plt.plot(years_num, data['城镇人口'], marker='o', linewidth=3, 
             markersize=8, label='城镇人口', color='green')
    plt.plot(years_num, data['乡村人口'], marker='s', linewidth=3, 
             markersize=8, label='乡村人口', color='red')
    plt.xlabel('年份')
    plt.ylabel('人口数量（万人）')
    plt.title('城镇和乡村人口变化趋势折线图')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('城乡人口趋势图_v5.png', dpi=300, bbox_inches='tight')
    plt.close()
    
    # 4. 散点图
    plt.figure()
    plt.scatter(data['年末总人口'], data['城镇人口'], c='purple', alpha=0.7, s=100)
    z = np.polyfit(data['年末总人口'], data['城镇人口'], 1)
    p = np.poly1d(z)
    plt.plot(data['年末总人口'], p(data['年末总人口']), "r--", alpha=0.8, linewidth=2)
    plt.xlabel('年末总人口（万人）')
    plt.ylabel('城镇人口（万人）')
    plt.title('城镇人口与年末总人口关系散点图')
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('城镇人口散点图_v5.png', dpi=300, bbox_inches='tight')
    plt.close()
    
    print("✅ 单独图表已保存")

def generate_summary_report():
    """生成分析总结报告"""
    print_header("📋 数据分析总结报告")
    
    print("🎯 任务完成情况：")
    print("   ✅ 员工数据分析 - 已完成")
    print("   ✅ 人口数据可视化 - 已完成")
    
    print("\n📁 生成的文件：")
    files = [
        "dataoutput.xlsx - 处理后的员工数据",
        "人口数据可视化报告_v5.png - 综合可视化报告", 
        "城乡人口柱状图_v5.png - 城乡人口对比图",
        "2022年性别比例饼图_v5.png - 性别比例图",
        "城乡人口趋势图_v5.png - 人口变化趋势图",
        "城镇人口散点图_v5.png - 相关性散点图"
    ]
    
    for i, file in enumerate(files, 1):
        print(f"   {i}. {file}")
    
    print(f"\n⏱️ 任务完成时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("🎉 所有任务已成功完成！")

def main():
    """主程序入口"""
    print("🚀 启动商务数据分析系统 - 简洁高效版")
    
    try:
        # 执行任务一
        employee_data = task_one()
        
        # 执行任务二  
        population_data = task_two()
        
        # 生成总结报告
        generate_summary_report()
        
    except Exception as e:
        print(f"❌ 程序执行出错：{e}")
        print("请检查数据文件是否存在且格式正确")

if __name__ == "__main__":
    main() 